package offer.offer04;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 42, 36, 很烦, 错了无数次, 语法不要了???
 * 取子串.substring(a, b) 是不包括b的, 也就是取到
 */
public class Solution58 {
    public String reverseWords(String s) {
        if(s == null || s.length() == 0) return "";
//        while (s.charAt(s.length() - 1) == ' ') s = s.substring(0, s.length() - 1);
//        while (s.charAt(0) == ' ') s = s.substring(1, s.length());
        String[] sArray = s.split(" ");
        //注意要消除掉""元素, 如果中间有两个" ", 或者末尾有一个" ", 会有""元素;
        List<String> sList = new ArrayList<>(Arrays.asList(sArray));
        sList = sList.stream().filter(s1 -> !s1.equals("")).collect(Collectors.toList());
        sArray = sList.toArray(new String[0]);
        for(int i = 0; i < sArray.length/2; i ++){
            String tmp = sArray[i];
            sArray[i] = sArray[sArray.length - i - 1];
            sArray[sArray.length - i - 1] = tmp;
        }
        return String.join(" ", sArray);
    }
    public String reverseWords2(String s) {
        s = s.trim(); // 删除首尾空格
        int j = s.length() - 1, i = j;
        StringBuilder res = new StringBuilder();
        while(i >= 0) {
            while(i >= 0 && s.charAt(i) != ' ') i--; // 搜索首个空格
            res.append(s.substring(i + 1, j + 1) + " "); // 添加单词
            while(i >= 0 && s.charAt(i) == ' ') i--; // 跳过单词间空格
            j = i; // j 指向下个单词的尾字符
        }
        return res.toString().trim(); // 转化为字符串并返回
    }

    /**
     * s.trim()消除首位空格
     */
    public String reverseWords3(String s) {
        String[] strs = s.trim().split(" "); // 删除首尾空格，分割字符串
        StringBuilder res = new StringBuilder();
        for(int i = strs.length - 1; i >= 0; i--) { // 倒序遍历单词列表
            if(strs[i].equals("")) continue; // 遇到空单词则跳过
            res.append(strs[i] + " "); // 将单词拼接至 StringBuilder
        }
        return res.toString().trim(); // 转化为字符串，删除尾部空格，并返回
    }

    public static void main(String[] args) {
        String input = "  hello   world!    ";
        System.out.println("**" + new Solution58().reverseWords(input) + "**");
    }
}
